//把n个骰子扔在地上，所有骰子朝上一面的点数之和为s。输入n，打印出s的所有可能的值出现的概率。 
//
// 
//
// 你需要用一个浮点数数组返回答案，其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。 
//
// 
//
// 示例 1: 
//
// 输入: 1
//输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
// 
//
// 示例 2: 
//
// 输入: 2
//输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0
//.05556,0.02778] 
//
// 
//
// 限制： 
//
// 1 <= n <= 11 
// 👍 153 👎 0

package leetcode.editor.cn;
//Java：n个骰子的点数
public class NgeTouZiDeDianShuLcof{
    public static void main(String[] args) {
        Solution solution = new NgeTouZiDeDianShuLcof().new Solution();
        
    }
    
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public double[] dicesProbability(int n) {
        //动态规划的题目
        //状态转移
        double[] pre = {1/6d,1/6d,1/6d,1/6d,1/6d,1/6d};
        //此时的n等于1的话，就不用进行叠加的操作，直接返回pre数组
        for (int i = 2; i <= n; i++) {
            double[] temp = new double[ 6*i -i +1 ];
            //叠加操作，一步步地在原来数组的基础上进行操作，接着扔一次硬币
            //下标从0开始计算
            for (int j = 0; j < pre.length; j++) {
                for (int k = 0; k < 6; k++) {
                    temp[ j+k ] += pre[j] * (1/6d);
                }
            }
            pre = temp;
        }
        return pre;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
